﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ActionTrackerEntities;
using ActionTrackerRules;
using ActionTrackerWeb.Models;

namespace ActionTrackerWeb.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            if (Session["UsuarioLogueado"] != null && ((Usuario)Session["UsuarioLogueado"]).IdProyectoSeleccionado.HasValue)
            {
                //busco las acciones del usuario logueado
                AccionRules oAccionRules = new AccionRules();
                List<Accion> oListAccion = oAccionRules.GetByFiltro(((Usuario)Session["UsuarioLogueado"]).IdUsuario, null, ((Usuario)Session["UsuarioLogueado"]).IdProyectoSeleccionado, EstadoAccionEnum.Abierta);
                return View(oListAccion);
            }
            
            return View();
        }

        [HttpPost]
        public ActionResult Login(LogOnModel model)
        {
            //busco al usuario
            UsuarioRules oUsuarioRules = new UsuarioRules();
            Usuario oUsuarioLogueado = oUsuarioRules.GetLogin(model.UserName, model.Password);
            
            if (oUsuarioLogueado == null)
            {
                Session["MensajeError"] = "Usuario no encontrado";
            }
            else
            {
                Session["UsuarioLogueado"] = oUsuarioLogueado;

                List<Proyecto> oListProyectosActivos = new List<Proyecto>();
                //si es administrador traigo todos los proyectos y selecciono el mas reciente
                if (((Usuario)Session["UsuarioLogueado"]).TipoUsuario == (int)TipoUsuarioEnum.Administrador)
                {
                    ProyectoRules oProyectoRules = new ProyectoRules();
                    oListProyectosActivos = oProyectoRules.GetByFiltro(true);
                }
                else
                {
                    //busco los proyectos ACTIVOS del usuario (hibernate ya me trae los proyectos del usuario)
                    oListProyectosActivos = ((Usuario)Session["UsuarioLogueado"]).Proyectos.Where(x => x.FechaBaja == null).ToList();
                }
                
                ((Usuario) Session["UsuarioLogueado"]).Proyectos = oListProyectosActivos;

                
                List<Accion> oListAccion = new List<Accion>();

                if (((Usuario)Session["UsuarioLogueado"]).Proyectos.Any())
                {
                    //selecciono el más reciente
                    ((Usuario)Session["UsuarioLogueado"]).IdProyectoSeleccionado = oUsuarioLogueado.Proyectos.OrderByDescending(x => x.FechaCreacion).FirstOrDefault().IdProyecto;
                    
                    //busco las acciones para ese proyecto
                    AccionRules oAccionRules = new AccionRules();
                    oListAccion = oAccionRules.GetByFiltro(((Usuario)Session["UsuarioLogueado"]).IdUsuario, null, ((Usuario)Session["UsuarioLogueado"]).IdProyectoSeleccionado, EstadoAccionEnum.Abierta);
                }
                
                return View("Index",oListAccion);
            }

            return View("Index");
        }

        public ActionResult LogOff()
        {
            Session["UsuarioLogueado"] = null;
            return View("Index");
        }

        public ActionResult EditAccion(int id)
        {
            return RedirectToAction("Edit", "Accion", new { id });
        }

        public ActionResult CambiarProyecto(int pIdProyecto)
        {
            if (Session["UsuarioLogueado"] != null)
            {
                ((Usuario)Session["UsuarioLogueado"]).IdProyectoSeleccionado = pIdProyecto;
                //busco las acciones del usuario logueado
                AccionRules oAccionRules = new AccionRules();
                List<Accion> oListAccion = oAccionRules.GetByFiltro(((Usuario)Session["UsuarioLogueado"]).IdUsuario, ((Usuario)Session["UsuarioLogueado"]).IdProyectoSeleccionado, null, EstadoAccionEnum.Abierta);
                return View("Index", oListAccion);
            }
            return View("Index");
            
        }
    }
}
